package com.haojin.spring.aop.xmlAop;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @author .29.
 * @create 2023-02-04 22:47
 */

//@Component代表将此类交给Spring处理，能够放入IOC容器中去

@Component
public class LogAspect {


    //通知类型：
    //前置
    public void beforeMethod(JoinPoint joinPoint){
        String name = joinPoint.getSignature().getName();//获取增强方法的名字
        Object[] args = joinPoint.getArgs();             //获取增强方法的参数数组
        System.out.println("Logger-->前置通知，增强方法为："+name+",参数："+ Arrays.toString(args));
    }

    //返回
    public void afterReturningMethod(JoinPoint joinPoint,Object result){//可以存在参数JoinPoint，以此来获取信息
        String name = joinPoint.getSignature().getName();//获取增强方法的名字
        System.out.println("Logger-->返回通知，增强方法为："+name+"，返回结果："+result);

    }

    //异常
    //增加 Throwable类型参数，参数名必须与切入点表达式保持一致（exception）
    public void aAfterThrowingMethod(JoinPoint joinPoint,Throwable exception){//可以存在参数JoinPoint，以此来获取信息
        String name = joinPoint.getSignature().getName();//获取增强方法的名字
        System.out.println("Logger-->异常通知，增强方法为："+name+"异常信息："+exception);

    }

    //后置
    public void afterMethod(JoinPoint joinPoint){//可以存在参数JoinPoint，以此来获取信息
        String name = joinPoint.getSignature().getName();//获取增强方法的名字
        System.out.println("Logger-->后置通知，增强方法为："+name);

    }
    //环绕通知
    public Object aroundMethod(ProceedingJoinPoint joinPoint){
        String name = joinPoint.getSignature().getName();//通过ProceedingJoinPoint参数获取增强方法名
        Object[] args = joinPoint.getArgs();             //获取增强方法参数数组
        String argStr = Arrays.toString(args);           //参数数组转字符串
        Object result = null;

        try{
            System.out.println("环绕通知 == 增强方法执行前执行");

            //通过ProceedingJoinPoint类型参数调用增强方法
            result = joinPoint.proceed();

            System.out.println("环绕通知 = 增强方法返回值之后执行");

        }catch(Throwable throwable){//捕捉Throwable类型异常
            throwable.printStackTrace();
            System.out.println("环绕通知 = 增强方法异常时执行");

        }finally {
            System.out.println("环绕方法 = 增强方法执行完毕执行");

        }

        return result;
    }

    //切面优先级：
    /*
    * 切面的优先级空值切面的 内外嵌套 顺序
    * 外层切面：优先级高
    * 内层切面：优先级低
    *
    * 可使用@Order()注解设置优先级
    * @Order(较小的数) 优先级较高
    * @Order(较大的数) 优先级较低
    * */
}
